// SPDX-FileCopyrightText: 2023-2025 Sangfor Technologies Inc.
// SPDX-License-Identifier: Mulan PSL v2
package com.geniusai.aip.auth.service;

import com.geniusai.aip.auth.domain.ChangePasswordEntity;
import com.geniusai.aip.auth.domain.EditEntity;
import com.geniusai.aip.auth.domain.Resource;
import com.geniusai.aip.auth.domain.ResponseTokenDTO;
import com.geniusai.aip.auth.domain.TotalResource;
import com.geniusai.aip.auth.domain.UserDO;
import com.geniusai.aip.auth.domain.UserProfile;
import com.geniusai.aip.auth.domain.UserVO;
import com.geniusai.aip.auth.domain.UsersVO;
import com.geniusai.aip.auth.domain.VGpuInfoVO;
import com.geniusai.aip.auth.domain.VGpuMemoryRemainVO;
import com.geniusai.aip.auth.domain.ResourceUsageTrendVO;
import com.geniusai.aip.feature.common.web.common.PageModel;
import org.springframework.validation.annotation.Validated;

import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import java.net.URISyntaxException;
import java.util.List;

/**
 * @author hml14563
 * @date 2021/3/19
 */
@Validated
public interface UserService {

    /**
     * 创建多用户
     *
     * @param usersVO 多用户
     * @return userVO
     */
    List<UserVO> createUsers(@Valid UsersVO usersVO);

    /**
     * 通过controller请求创建Eds用户
     *
     * @param userDO 用户
     * @return userDO
     */
    UserDO createEdsUserBucket(UserDO userDO);

    /**
     * 创建single用户
     *
     * @param userDO 多用户
     * @return userVO
     */
    UserVO createUser(@Valid UserDO userDO);

    /**
     * 修改对应用户的密码
     *
     * @param userId               userId
     * @param changePasswordEntity 修改密码实体类
     */
    void changePassword(@Valid ChangePasswordEntity changePasswordEntity, String userId);

    /**
     * 根据用户名密码查询用户是否正确
     *
     * @param username 用户名
     * @param password 密码
     * @return true or false
     */
    Boolean queryUserByUsernameAndPassword(String username, String password);

    /**
     * 判断是不是第一次登陆
     *
     * @return true or false
     */
    Boolean isFirstLogin();

    /**
     * 根据用户名获取对应唯一标识符
     *
     * @param username 用户名信息
     * @return 用户的唯一表示符
     */
    Integer getRoleByUsername(String username);

    /**
     * 根据用户名获取对应唯一标识符
     *
     * @param username 用户名信息
     * @return 用户的对象存储access key
     */
    String getS3AccessKeyByUsername(String username);

    /**
     * 根据用户名获取对应唯一标识符
     *
     * @param username 用户名信息
     * @return 用户的对象存储secret key
     */
    String getS3SecretKeyByUsername(String username);

    /**
     * 根据用户ID通过controller请求删除Eds用户
     *
     * @param userId 用户的ID
     */
    void deleteEdsUser(String userId);

    /**
     * 根据用户ID删除用户
     *
     * @param userId 用户的ID
     */
    void deleteUser(String userId);

    /**
     * 获取用户列表
     *
     * @param keyword 关键字信息
     * @return 用户的所有信息
     */
    PageModel<UserVO> getUser(String keyword);

    /**
     * 编辑指定用户
     *
     * @param userId     用户的ID
     * @param editEntity 用户的实体信息
     * @return 修改后的用户信息
     */
    UserVO editUser(String userId, @Valid EditEntity editEntity);

    /**
     * 获取当前集群的资源
     *
     * @return 获取当前集群的资源使用情况
     */
    TotalResource getResource();

    /**
     * 根据用户Id获取资源使用情况
     *
     * @param userId userId
     * @return 用户Id资源使用情况
     */
    Resource getResourceByUserId(String userId);

    /**
     * 根据用户Id获取profile使用情况
     *
     * @param userId userId
     * @return profile使用情况
     */
    UserProfile getProfileByUserId(String userId);

    /**
     * 获取信息
     *
     * @param request
     * @return 用户登陆信息
     */
    ResponseTokenDTO getLoginInfo(HttpServletRequest request);

    /**
     * 用户vGPU算力利用率趋势图
     * @param userId
     * @param timeCode
     * @return
     */
    ResourceUsageTrendVO getVGpuRatioUsageTrend(String userId, String timeCode);

    /**
     * 用户vGPU内存占用趋势图
     * @param userId
     * @param timeCode
     * @return
     */
    ResourceUsageTrendVO getVGpuMemoryUsageTrend(String userId, String timeCode) throws URISyntaxException;

    /**
     * 系统vGPU信息
     * @return
     */
    VGpuInfoVO getVGpuInfo();

    /**
     * 用户剩余可用vGpu信息
     * @return
     */
    VGpuMemoryRemainVO getVGpuMemoryRemain(String userId);

    /**
     * 资源占用趋势图
     * @return
     */
    ResourceUsageTrendVO getResourceUsingGraph(String timeCode, String trendChartType);


    public Double getUserUsedVGpuMemory(String userId);

}
